/**
 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef PANDA_ASSEMBLER_EXTENSIONS_REGISTER_EXTENSIONS_H
#define PANDA_ASSEMBLER_EXTENSIONS_REGISTER_EXTENSIONS_H

#include "extensions/extensions.h"
#include "extensions/ecmascript_meta.h"

namespace panda::pandasm::extensions {
std::unique_ptr<panda::pandasm::RecordMetadata> MetadataExtension::CreateRecordMetadata(panda::panda_file::SourceLang lang)
{
    switch (lang) {
        case Language::ECMASCRIPT:
        case Language::JAVASCRIPT:
        case Language::TYPESCRIPT:
        case Language::ARKTS:
            return std::make_unique<panda::pandasm::extensions::ecmascript::RecordMetadata>();
        case Language::PANDA_ASSEMBLY:
            return std::make_unique<panda::pandasm::RecordMetadata>();
        default:
            break;
    }

    UNREACHABLE();
    return {};
}

std::unique_ptr<panda::pandasm::FieldMetadata> MetadataExtension::CreateFieldMetadata(panda::panda_file::SourceLang lang)
{
    switch (lang) {
        case Language::ECMASCRIPT:
        case Language::JAVASCRIPT:
        case Language::TYPESCRIPT:
        case Language::ARKTS:
            return std::make_unique<panda::pandasm::FieldMetadata>();
        case Language::PANDA_ASSEMBLY:
            return std::make_unique<panda::pandasm::FieldMetadata>();
        default:
            break;
    }

    UNREACHABLE();
    return {};
}

std::unique_ptr<panda::pandasm::FunctionMetadata> MetadataExtension::CreateFunctionMetadata(panda::panda_file::SourceLang lang)
{
    switch (lang) {
        case Language::ECMASCRIPT:
        case Language::JAVASCRIPT:
        case Language::TYPESCRIPT:
        case Language::ARKTS:
            return std::make_unique<panda::pandasm::FunctionMetadata>();
        case Language::PANDA_ASSEMBLY:
            return std::make_unique<panda::pandasm::FunctionMetadata>();
        default:
            break;
    }

    UNREACHABLE();
    return {};
}

std::unique_ptr<panda::pandasm::ParamMetadata> MetadataExtension::CreateParamMetadata(panda::panda_file::SourceLang lang)
{
    switch (lang) {
        case Language::ECMASCRIPT:
        case Language::JAVASCRIPT:
        case Language::TYPESCRIPT:
        case Language::ARKTS:
            return std::make_unique<panda::pandasm::ParamMetadata>();
        case Language::PANDA_ASSEMBLY:
            return std::make_unique<panda::pandasm::ParamMetadata>();
        default:
            break;
    }

    UNREACHABLE();
    return {};
}
}  // namespace panda::pandasm::extensions
#endif  // PANDA_ASSEMBLER_EXTENSIONS_REGISTER_EXTENSIONS_H
